/**
 * @file
 * @author dousha
 * @date 2020
 */

#ifndef CONFIG_H
#define CONFIG_H

/**
 * @defgroup kernelDebug 内核调试
 */

/**
 * @defgroup boardConfig 板型设置
 *
 * 见 `docs/boards.md` 中关于板子型号的详细说明。
 */

/**
 * @defgroup periphConfig 外设配置
 *
 * 见 `docs/peripherals.md` 中关于外设的确切配置。
 * 不同的板子会有不同的外设配置，这些配置可能随着迭代而有所变更，
 * 但不会在代码中体现。
 */

/**
 * @defgroup memoryConfig 内存配置
 */

/**
 * @defgroup deducedConfig 推导配置
 *
 * 这些配置是根据手动配置自动生成的，如非必要请勿更改。
 */

/**
 * @ingroup kernelDebug
 *
 * 启用调试函数
 */
#define KERNEL_DEBUG
/**
 * @ingroup kernelDebug
 *
 * 启用详细输出
 */
#define KERNEL_VERBOSE
/**
 * @ingroup kernelDebug
 *
 * 将调试信息打印到串口而不使用 semi-hosting
 */
#define DEBUG_USE_SERIAL
/**
 * @ingroup kernelDebug
 * 
 * 使用 USB 虚拟串口作为调试串口
 * 
 * 需要同时设置 USB_FUNCTION 为 SERIAL
 */
#define DEBUG_USE_USB
/**
 * @ingroup kernelDebug
 * 
 * 调试信息输出串口
 */
#define DEBUG_SERIAL_PORT USART1
/**
 * @ingroup kernelDebug
 *
 * 设置串口波特率。
 *
 * 串口将总是使用 8N1, 无流控。
 */
#define DEBUG_BAUD 115200


/**
 * @ingroup boardConfig
 *
 * 核心型号
 */
#define STM32F407
// #define STM32F412
/**
 * @ingroup boardConfig
 * 
 * 选择 USB 的工作状态。
 * 
 * 可用的值有：
 * 
 * - DISABLE: 不使用 USB
 * - SERIAL: 将 USB 用做虚拟串口
 * - FILE: 将 USB 用做文件 IO
 */
#define USB_FUNCTION SERIAL
/**
 * @ingroup boardConfig
 * 
 * SysTick 的计数频率。
 * 
 * 通常建议选择 10 的整数倍。
 * 
 */
#define SYSTICK_FREQUENCY 100000

/**
 * @ingroup memoryConfig
 *
 * 使用内置 CCMRAM 而不使用 SRAM.
 *
 * 不是所有核心都有 CCMRAM. 使用前必须参考手册，否则可能会导致严重问题。
 */
#define USE_CCMRAM
/**
 * @ingroup memoryConfig
 *
 * 使 NIL 和 NULL 的值相同。
 */
#define NIL_IS_NULL
/**
 * @ingroup memoryConfig
 *
 * 将所有内存操作对齐到 4 字节。
 */
#define MEMORY_ALIGN_4B
/**
 * @ingroup memoryConfig
 *
 * 将双重释放视为严重错误。
 */
#define DOUBLE_FREE_IS_VIOLATION
/**
 * @ingroup memoryConfig
 *
 * 将越权释放视为严重错误。
 */
#define UNPRIVILEGED_FREE_IS_VIOLATION
/**
 * @ingroup memoryConfig
 *
 * 将空指针释放视为严重错误。
 */
#define NIL_FREE_IS_VIOLATION
/**
 * @ingroup memoryConfig
 *
 * 将野指针释放视为严重错误。
 */
#define WILD_FREE_IS_VIOLATION
/**
 * @ingroup memoryConfig
 * 
 * 任务栈大小，单位为对齐量。
 * 
 * 当内存按 4 字节对齐时，分配 4 * TASK_STACK_SIZE 字节的空间，
 * 按 8 字节对齐时，分配 8 * TASK_STACK_SIZE 字节的空间，
 * 不对齐时，分配 TASK_STACK_SIZE 字节的空间。
 */
#define TASK_STACK_SIZE 256

/**
 * @ingroup periphConfig
 * 
 * 使用 GPIO.
 */
#define HAS_GPIO
/**
 * @ingroup periphConfig
 * 
 * 使用串口。具体的串口实现 (UART/USART) 可能会不同。
 */
#define HAS_SERIAL
/**
 * @ingroup periphConfig
 * 
 * 使用 SPI.
 */
#define HAS_SPI
/**
 * @ingroup periphConfig
 * 
 * 使用 I2C.
 */
#define HAS_I2C

#endif
